package com.easytest.controller;

import com.alibaba.druid.util.StringUtils;
import com.easytest.domain.UserInfo;
import com.easytest.enums.VerifyRegexEnum;
import com.easytest.service.UserInfoService;
import com.easytest.util.R;
import com.easytest.utils.VerifyUtils;
import org.apache.ibatis.annotations.Param;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

/**
 * 用户信息(UserInfo)表控制层
 *
 * @author 陈标
 * @since 2023-11-03 21:14:28
 */
@CrossOrigin
@RestController
@RequestMapping("userInfo")
public class UserInfoController {
    /**
     * 服务对象
     */
    @Resource
    private UserInfoService userInfoService;

    /**
     * 全查询
     *
     * @param userInfo 筛选条件
     * @return 查询结果
     */
    @RequestMapping("loadDataList")
    public R queryAll(UserInfo userInfo) {
        return this.userInfoService.queryAll(userInfo);
    }

    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @GetMapping("{id}")
    public R queryById(@PathVariable("id") Integer id) {
        return this.userInfoService.queryById(id);
    }

    /**
     * 新增数据
     *
     * @param userInfo 实体
     * @return 新增结果
     */
    @PostMapping
    public R add(@RequestBody UserInfo userInfo) {
        return this.userInfoService.insert(userInfo);
    }

    /**
     * 编辑数据
     *
     * @param userInfo 实体
     * @return 编辑结果
     */
    @PutMapping
    public R edit(@RequestBody UserInfo userInfo) {
        return this.userInfoService.update(userInfo);
    }

    //新增 修改
    @RequestMapping("/saveUser")
    public R saveUser(UserInfo userInfo){
        System.out.println("userInfo = " + userInfo);
        if(userInfo.getUserId()==null&&(StringUtils.isEmpty(userInfo.getPassword())|| !VerifyUtils.verify(VerifyRegexEnum.PASSWORD,userInfo.getPassword()))){
            return R.fail("密码不能为空，只能是数字、字母、特殊字符 8-18位");
        }
        if(StringUtils.isEmpty(userInfo.getUserName())||userInfo.getUserName().length()>10){
            return R.fail("姓名不能为空，长度不能超过10位");
        }
        if(StringUtils.isEmpty(userInfo.getPhone())||!VerifyUtils.verify(VerifyRegexEnum.PHONE,userInfo.getPhone())){
            return R.fail("手机号不能为空，且格式是正确");
        }
        if(userInfo.getBirthday()==null){
            return R.fail("出生日期不能为空");
        }
        if(userInfo.getSex()==null){
            return R.fail("性别不能为空");
        }
        if(userInfo.getPosition()==null){
            return R.fail("职位不能为空");
        }
        if(StringUtils.isEmpty(userInfo.getRoles())){
            return R.fail("角色不能为空");
        }
        return userInfoService.saveUser(userInfo);
    }

    //修改密码
    @RequestMapping("updatePassword")
    public R updatePassword(String password,Integer userId){
        if(StringUtils.isEmpty(password)||!VerifyUtils.verify(VerifyRegexEnum.PASSWORD,password)){
            return R.fail("密码不能为空，只能是数字、字母、特殊字符 8-18位");
        }
        if(userId==null){
            return R.fail("用户ID不能为空");
        }
        R r = userInfoService.queryById(userId);
        UserInfo userInfo=(UserInfo) r.getData();
        if(userInfo==null){
            return R.fail("用户信息不存在！");
        }
        userInfo.setPassword(password);
        return userInfoService.update(userInfo);
    }

    /**
     * 删除数据
     *
     * @param id 主键
     * @return 删除是否成功
     */
    @RequestMapping("delete")
    public R deleteById(@RequestParam("userId") Integer id) {
        if(id==null){
            return R.fail("用户ID不能为空");
        }
        UserInfo userInfo=(UserInfo)userInfoService.queryById(id).getData();
        if(userInfo==null){
            return R.fail("用户信息不存在！");
        }
        return this.userInfoService.deleteById(id);
    }

    /**
     * 分页全查询
     *
     * @param userInfo 实体
     * @param pageNum  当前第几页
     * @param pageSize 每页数量
     * @return 查询结果
     */
    @GetMapping("query")
    public R queryByPage(UserInfo userInfo,@RequestParam(value = "pageNo",defaultValue = "1") Integer pageNum,@RequestParam(defaultValue = "8") Integer pageSize) {
        System.out.println("userInfo = " + userInfo + ", pageNum = " + pageNum + ", pageSize = " + pageSize);
        return this.userInfoService.queryByPage(userInfo, pageNum, pageSize);
    }
}
